////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                                                                                                                            //
//                                                         WNProject                                                          //
//                                                                                                                            //
//            This file is distributed under the BSD 2-Clause open source license. See License.txt for details.               //
//                                                                                                                            //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include "WNMath/inc/WNBasicMath.h"

#include <math.h>

namespace WNMath {
    WN_FLOAT32 WNAbs(WN_FLOAT32 _x) {
        return(fabsf(_x));
    }

    WN_FLOAT32 WNMod(WN_FLOAT32 _x, WN_FLOAT32 _y) {
        return(fmodf(_x, _y));
    }

    WN_FLOAT32 WNRound(WN_FLOAT32 _x) {
        return(floorf(_x + 0.5f));
    }

    WN_FLOAT32 WNCeil(WN_FLOAT32 _x) {
        return(ceilf(_x));
    }

    WN_FLOAT32 WNFloor(WN_FLOAT32 _x) {
        return(floorf(_x));
    }

    WN_FLOAT32 WNTrunc(WN_FLOAT32 _x) {
        if (_x > 0.0f) {
            return(floorf(_x));
        } else if (_x < 0.0f) {
            return(ceilf(_x));
        }

        return(0.0f);
    }

    WN_FLOAT32 WNSqrt(WN_FLOAT32 _x) {
        return(sqrtf(_x));
    }

    WN_FLOAT32 WNInvSqrt(WN_FLOAT32 _x) {
        return(1.0f / sqrtf(_x));
    }

    WN_FLOAT32 WNPow(WN_FLOAT32 _x, WN_FLOAT32 _y) {
        return(powf(_x, _y));
    }

    WN_FLOAT32 WNSin(WN_FLOAT32 _x) {
        return(sinf(_x));
    }

    WN_FLOAT32 WNCos(WN_FLOAT32 _x) {
        return(cosf(_x));
    }

    WN_FLOAT32 WNTan(WN_FLOAT32 _x) {
        return(tanf(_x));
    }

    WN_FLOAT32 WNASin(WN_FLOAT32 _x) {
        if (_x <= -1.0f) {
            return(static_cast<WN_FLOAT32>(-WN_PI_2));
        } else if (_x >= 1.0f) {
            return(static_cast<WN_FLOAT32>(WN_PI_2));
        }

        return(asinf(_x));
    }

    WN_FLOAT32 WNACos(WN_FLOAT32 _x) {
        if (_x <= -1.0f) {
            return(static_cast<WN_FLOAT32>(WN_PI));
        } else if (_x >= 1.0f) {
            return(0.0f);
        }

        return(acosf(_x));
    }

    WN_FLOAT32 WNATan(WN_FLOAT32 _x) {
        return(atanf(_x));
    }

    WN_FLOAT32 WNATan2(WN_FLOAT32 _x, WN_FLOAT32 _y) {
        return(atan2f(_x, _y));
    }

    WN_FLOAT32 WNExp(WN_FLOAT32 _x) {
        return(expf(_x));
    }

    WN_FLOAT32 WNExp2(WN_FLOAT32 _x) {
        return(powf(2.0f, _x));
    }

    WN_FLOAT32 WNLn(WN_FLOAT32 _x) {
        return(logf(_x));
    }

    WN_FLOAT32 WNLog2(WN_FLOAT32 _x) {
        return(logf(_x) / static_cast<WN_FLOAT32>(WN_LN2));
    }

    WN_FLOAT32 WNLog10(WN_FLOAT32 _x) {
        return(log10f(_x));
    }
}